From e56ed2dc521d9eccbcfb4db7de22ab621705864f Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Wed, 7 Jun 2006 13:42:21 +0100 Subject: [PATCH] [HVM][PIT] Fix missed_ticks() logic. Signed-off-by Xiaowei Yang --- xen/arch/x86/hvm/intercept.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/xen/arch/x86/hvm/intercept.c b/xen/arch/x86/hvm/intercept.c index 11884399c2..25a715cdfd 100644 --- a/xen/arch/x86/hvm/intercept.c +++ b/xen/arch/x86/hvm/intercept.c @@ -216,13 +216,14 @@ void hlt_timer_fn(void *data) static __inline__ void missed_ticks(struct periodic_time *pt) { - int missed_ticks; + s_time_t missed_ticks; - missed_ticks = (NOW() - pt->scheduled)/(s_time_t) pt->period; - if ( missed_ticks++ >= 0 ) { + missed_ticks = NOW() - pt->scheduled; + if ( missed_ticks > 0 ) { + missed_ticks = missed_ticks / (s_time_t) pt->period + 1; if ( missed_ticks > 1000 ) { /* TODO: Adjust guest time togther */ - pt->pending_intr_nr ++; + pt->pending_intr_nr++; } else { pt->pending_intr_nr += missed_ticks; @@ -237,6 +238,9 @@ void pt_timer_fn(void *data) struct vcpu *v = data; struct periodic_time *pt = &(v->domain->arch.hvm_domain.pl_time.periodic_tm); + pt->pending_intr_nr++; + pt->scheduled += pt->period; + /* pick up missed timer tick */ missed_ticks(pt); if ( test_bit(_VCPUF_running, &v->vcpu_flags) ) { -- 2.30.2